package com.example.student_manager_backend.repository;

import com.example.student_manager_backend.entity.Student;
import com.example.student_manager_backend.status.StudentStatus;
import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 学生数据访问层
 * 提供对学生实体的基本CRUD操作和自定义查询方法
 */
@Repository
public interface StudentRepository extends JpaRepository<Student, String>, JpaSpecificationExecutor<Student> {
    
    /**
     * 根据班级ID查询学生列表
     *
     * @param classId 班级ID
     * @return 学生列表
     */
    List<Student> findByClassId(String classId);

    /**
     * 根据姓名模糊查询学生列表
     *
     * @param name 学生姓名
     * @return 学生列表
     */
    List<Student> findByNameContaining(String name);

    /**
     * 根据学号查询学生
     *
     * @param studentId 学号
     * @return 学生对象
     */
    Student findByStudentId(String studentId);

    /**
     * 检查学号是否存在
     *
     * @param studentId 学号
     * @return 是否存在
     */
    boolean existsByStudentId(String studentId);
    /**
     * 根据班级查询班级编号列表
     *
     * @param classId 班级编号
     * @return 学生列表
     */
    /**
     * 查询指定班级中超过指定年龄的学生
     * @param classId 班级编号
     * @param ageThreshold 年龄阈值
     * @return 符合条件的学生列表
     */
    @Query("SELECT s FROM Student s " +
            "WHERE s.classId = :classId " +
            "AND s.status = :status " +
            "AND EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM s.birthday) > :ageThreshold")
    List<Student> findByClassIdAndAgeGreaterThan(
            @Param("classId") String classId,
            @Param("status") StudentStatus status,
            @Param("ageThreshold") int ageThreshold
    );


} 